package com.example.mytk2_15;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
// 类MainActivity实现了接口View.OnClickListener，MainActivity也是一个按键事件监听器
public class MainActivity extends AppCompatActivity  implements View.OnClickListener  {
    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit; //用于引用IP地址编辑框
    EditText ip_port; //用于引用端口号编辑框
    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮

    //停止按钮  向前按钮 加速按钮  向左按钮  向右按钮 向下按钮 减速按钮
    Button bt_stop, bt_up, bt_speedup ,bt_left  , bt_right , bt_down,bt_speeddown;
    EditText car_state;  //  显示小车状态编辑框

    String ip;  //用于存储IP地址
    int port;  //用于存储端口号
    Socket ss;  //网络通信使用的Socket

    DataOutputStream dataOutputStream=null;//网络通信使用的数据输出流，用于发送指令

    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x00};  //存储的指令，1条指令格式为3字节

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         tv_state=(TextView)this.findViewById(R.id.tv_state);
        //任务3_1 ：根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存
        ip_edit=(EditText)this.findViewById(R.id.ip_edit);
        //结束任务3_1
         ip_port=(EditText)this.findViewById(R.id.ip_port);

         bt_connect=(Button)this.findViewById(R.id.bt_connect);
         bt_close=(Button)this.findViewById(R.id.bt_close);

        bt_stop=(Button)this.findViewById(R.id.bt_stop);
        bt_up=(Button)this.findViewById(R.id.bt_up);
        bt_speedup=(Button)this.findViewById(R.id.bt_speedup);
        bt_left=(Button)this.findViewById(R.id.bt_left);

        bt_right=(Button)this.findViewById(R.id.bt_right);
        bt_down=(Button)this.findViewById(R.id.bt_down);
        bt_speeddown=(Button)this.findViewById(R.id.bt_speeddown);
        car_state=(EditText)this.findViewById(R.id.car_state);
        car_state.setText(" ");

        bt_connect.setOnClickListener(this);
        bt_close.setOnClickListener(this);
        bt_stop.setOnClickListener(this);
        bt_up.setOnClickListener(this);
        bt_speedup.setOnClickListener(this);
        bt_left.setOnClickListener(this);

        bt_right.setOnClickListener(this);
        bt_down.setOnClickListener(this);
        bt_speeddown.setOnClickListener(this);
        bt_down.setOnClickListener(this);

    }

  //连接服务器
    void connectToServer()
    {
        //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip
        ip=ip_edit.getText().toString().trim();
        //结束任务3_2
		port= Integer.parseInt(ip_port.getText().toString().trim());
		
        new Thread(new Runnable(){
            @Override
            public void run() {
                //连接网路，如果不产生异常，说明连接成功，设置tv_state文本为已连接
                try {
                //任务3_3 ：实现建立Socket网络连接 
                    ss=new Socket(ip,port);
                //结束任务3_3
				   //数据输出流DataInputStream
					dataOutputStream=new DataOutputStream(ss.getOutputStream());

                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态
                            tv_state.setText("已连接");
                            //结束任务3_4
                        }
						
                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
 //关闭连接
    void closeConnect()
    {
        try {
            ss.close();
            tv_state.setText("网络断开");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //发送停止小车指令， 修改小车状态为停止
    void stopCar()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    zl[2]=(byte)0x00;  // 停止指令的第3个字节是 0x00
                    dataOutputStream.write(zl);  // 写指令,即发送指令

                    runOnUiThread(new Runnable() {   //修改小车状态为停止
                        @Override
                        public void run() {
                            car_state.setText("停止");
                        }
                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
    //发送向前小车指令， 修改小车状态为向前
    void upCar()
    {
        //任务3_5 ：实现向前功能，向前指令的第3个字节是 0x01
        new Thread(new Runnable() {
            @Override
            public void run() {
                zl[2] = (byte)0x01;
                try {
                    dataOutputStream.write(zl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        car_state.setText("向前");
                    }
                });
            }
        }).start();
        //任务3_5
    }
    //发送加速小车指令， 修改小车状态为加速
    void speedupCar()
    {
        //任务3_5 ：实现加速功能，向前指令的第3个字节是 0x05
        new Thread(new Runnable() {
            @Override
            public void run() {
                zl[2] = (byte)0x05;
                try {
                    dataOutputStream.write(zl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        car_state.setText("加速");
                    }
                });
            }
        }).start();
        //任务3_5
    }
    //发送向左小车指令， 修改小车状态为向左
    void leftCar()
    {
        //任务3_5 ：实现左转功能，向前指令的第3个字节是 0x03
        new Thread(new Runnable() {
            @Override
            public void run() {
                zl[2] = (byte)0x03;
                try {
                    dataOutputStream.write(zl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        car_state.setText("左转");
                    }
                });
            }
        }).start();
        //任务3_5
    }
    //发送向右小车指令， 修改小车状态为向右
   void rightCar()
   {
       //任务3_5 ：实现右转功能，向前指令的第3个字节是 0x04
       new Thread(new Runnable() {
           @Override
           public void run() {
               zl[2] = (byte)0x04;
               try {
                   dataOutputStream.write(zl);
               } catch (IOException e) {
                   e.printStackTrace();
               }
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       car_state.setText("右转");
                   }
               });
           }
       }).start();
       //任务3_5
   }
    //发送向后小车指令， 修改小车状态为向后
    void downCar()
    {
        //任务3_5 ：实现向后功能，向前指令的第3个字节是 0x02
        new Thread(new Runnable() {
            @Override
            public void run() {
                zl[2] = (byte)0x02;
                try {
                    dataOutputStream.write(zl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        car_state.setText("向后");
                    }
                });
            }
        }).start();
        //任务3_5
    }
    //发送减速小车指令， 修改小车状态为减速
    void speeddownCar()
    {
        //任务3_5 ：实现减速功能，向前指令的第3个字节是 0x06
        new Thread(new Runnable() {
            @Override
            public void run() {
                zl[2] = (byte)0x06;
                try {
                    dataOutputStream.write(zl);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        car_state.setText("减速");
                    }
                });
            }
        }).start();
        //任务3_5
    }
    //按键处理
    @Override
    public void onClick(View view) {

        car_state.setText(" ");
        switch(view.getId())  //获得组件ID号，根据按键ID号调用不同按键处理函数
        {
            case R.id.bt_connect:  //连接按钮
                connectToServer();
                 break;
            case R.id.bt_close:
                closeConnect();
                break;
            case  R.id.bt_stop:
                stopCar();
                break;
            case  R.id.bt_up:
                 upCar();
                break;
            case  R.id.bt_speedup:
                speedupCar();
                break;
            case  R.id.bt_left:
                leftCar();
                break;
            case  R.id.bt_right:
                 rightCar();
                break;
            case  R.id.bt_down:
                 downCar();
                break;
            case  R.id.bt_speeddown:
                speeddownCar();
                break;
        }

    }
}